/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ar.com.gruposicom.controller;

import ar.com.gruposicom.domain.Command;
import ar.com.gruposicom.domain.Politic;
import ar.com.gruposicom.domain.Result;
import ar.com.gruposicom.logic.ResultAnalizer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextArea;

/**
 *
 * @author marcelo
 */
public class ExecuteCommand extends Thread
{
    private final Command command;
    private final SystemOut salida;
    private static String correct = "CORRECTO";
    private final String fail = "ERROR";
    
    public ExecuteCommand(Command command, SystemOut salida)
    {
        this.command = command;
        this.salida = salida;
    }
    
    /**
     * Este mismo metodo voy a hacer la validacion de las politicas de cada comando
     */
    @Override
    public void run()
    {
        try {
            Runtime ejecuta = Runtime.getRuntime();
            Process proceso = ejecuta.exec(command.getCommand());
            Collection<String> out = new ArrayList<>();
            InputStreamReader entrada = new InputStreamReader( proceso.getInputStream() );
            BufferedReader buffer = new BufferedReader( entrada );

            String linea = "";
            salida.append("");
            salida.append("Ejecutando el comando "+command.getCommand());
            salida.append("-----------------------------------------------");
            salida.append("");
            for( ;(linea = buffer.readLine() ) != null; )
            {
                salida.append(linea);
                out.add(linea);
                System.out.println("Linea agregada");
            }

            System.out.println("ya termino el for");
//            Result r = command.getRes();
            Result r = new Result();
            r.setValues(out);
            
            //fecha actual
            Date ahora = new Date();
            SimpleDateFormat formateador = new SimpleDateFormat("dd-MM-yyyy");
            r.setDate(formateador.format(ahora));
            r.setHour(getHoraActual());
            command.setRes(r);
            salida.setCommand(command);
            
            System.out.println("Empezando el analisis de la salida");
            
            analize(command, r);
            
            buffer.close();
            
        } catch (IOException ex) 
        {
            salida.append("");
            salida.append("No se puede ejecutar el comando "+command.getCommand());
            salida.append("No existe el archivo o el directorio");
            salida.append("-----------------------------------------------");
            Logger.getLogger(ExecuteCommand.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public static String getHoraActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("hh:mm:ss");
        return formateador.format(ahora);
    }
    
    public void analize(Command co, Result r)
    {
        ResultAnalizer re= new ResultAnalizer();
            Iterator<Politic> it = co.getPolitics().iterator();
            
            boolean band= true;
            while(it.hasNext())
            {
                Politic p = it.next();
                band = re.getPoliticState(r, p);
                System.out.println("El resultado del analisis de la politica "+p.getName()+ " es "+band);
                if(band)
                    salida.setPoliticStatus(p, correct);
                else
                    salida.setPoliticStatus(p, fail);
            }
    }
}
